import csv # 导入csv模块，用于读写CSV文件
def main(): # 定义主函数，程序的入口点
    # 定义calculate_bmr函数，用于计算基础代谢率（BMR）
    def calculate_bmr(gender, weight, height, age):
        try:
            # 将输入的体重、身高和年龄转换为适当的数据类型
            weight = float(weight)
            height = float(height)
            age = int(age)

            # 检查输入的体重、身高和年龄是否为正数
            if weight <= 0 or height <= 0 or age <= 0:
                raise ValueError("输入的体重、身高和年龄必须是正数。")

            # 根据性别使用不同的公式计算BMR
            if gender.lower() == 'male':
                bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
            elif gender.lower() == 'female':
                bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
            else:
                raise ValueError("性别必须是'male'或'female'。")

            return bmr # 返回计算得到的BMR值
        except ValueError as e:
            # 如果发生ValueError，输出错误信息并返回None
            print(f"输入错误：{e}")
            return None

    # 定义health_analysis函数，用于根据BMR值提供健康分析
    def health_analysis(bmr):
        if bmr is None:
            return "无法进行健康分析，因为BMR计算失败。"
        # 根据BMR值的范围提供不同的健康建议
        if bmr < 1200:
            return "您的BMR指数偏低，可能需要增加营养摄入或咨询医生。"
        elif 1200 <= bmr < 1500:
            return "您的BMR指数在正常范围内，但偏静。考虑增加活动量或咨询营养师以优化饮食。"
        elif 1500 <= bmr < 1800:
            return "您的BMR指数正常，继续保持健康的生活方式。"
        else:
            return "您的BMR指数偏高，可能需要调整饮食和锻炼习惯。"

    # 定义get_user_input函数，用于获取用户输入并转换为指定类型
    def get_user_input(prompt, cast_to_type=str):
        while True:
            try:
                return cast_to_type(input(prompt).strip()) # 读取用户输入并去除首尾空白字符后转换为指定类型
            except ValueError:
                print(f"无效的输入，请确保输入是{cast_to_type.__name__}类型。") # 如果转换失败，提示用户

    # 定义create_csv_header函数，用于创建CSV文件头
    def create_csv_header():
        print("正在创建CSV文件头...")
        with open('bmr_data.csv', 'w', newline='') as csvfile: # 打开文件用于写入
            writer = csv.writer(csvfile)
            writer.writerow(['性别', '体重(kg)', '身高(cm)', '年龄(岁)', 'BMR(卡路里/天)'])
        print("CSV文件头已创建。")

    # 定义write_bmr_to_csv函数，用于将BMR数据写入CSV文件
    def write_bmr_to_csv(bmr_data):
        with open('bmr_data.csv', 'a', newline='') as csvfile: # 打开文件用于追加
            writer = csv.writer(csvfile) # 将BMR数据作为一行写入文件
            writer.writerow(bmr_data)
        print("BMR数据已写入bmr_data.csv。")

    # 定义menu函数，用于显示主菜单并获取用户选择
    def menu():
        while True:
            print("\n主菜单：")
            print("1. 进入BMR计算器")
            print("2. 退出程序")
            print("3. 生成CSV文件头")
            choice = get_user_input("请选择一个选项（1-3）：", int) # 获取用户选择并转换为整数
            if choice == 1:
                return 'calculate_bmr'
            elif choice == 2:
                return 'exit'
            elif choice == 3:
                return 'create_csv_header'
            else:
                print("无效的选项，请重新选择。")

    # 定义run_calculate_bmr函数，用于执行BMR计算流程
    def run_calculate_bmr():
        gender = get_user_input("请输入您的性别（male/female）：").lower() # 获取性别并转换为小写
        weight = get_user_input("请输入您的体重（公斤）：", float) # 获取体重
        height = get_user_input("请输入您的身高（厘米）：", float) # 获取身高
        age = get_user_input("请输入您的年龄：", int) # 获取年龄

        bmr = calculate_bmr(gender, weight, height, age) # 计算BMR
        analysis = health_analysis(bmr) # 获取健康分析
        print(f"您的BMR指数是：{bmr:.2f}卡路里/天" if bmr is not None else "无法计算BMR。")  # 输出BMR值或错误信息
        print(analysis) # 输出健康分析结果

        if bmr is not None:
            bmr_data = [gender, weight, height, age, bmr] # 准备写入CSV的数据
            write_bmr_to_csv(bmr_data) # 将数据写入CSV文件

    # 定义continue_prompt函数，用于询问用户是否继续使用程序
    def continue_prompt():
        while True:
            answer = input("是否继续使用程序？(yes/no): ").strip().lower() # 获取用户回答并转换为小写
            if answer not in ['yes', 'no']:
                print("请输入'yes'或'no'。")
            else:
                return answer == 'yes'

    # 主循环，根据用户选择执行相应功能
    while True:
        choice = menu() # 显示菜单并获取用户选择
        if choice == 'calculate_bmr':
            run_calculate_bmr() # 执行BMR计算流程
            if not continue_prompt():  # 询问用户是否继续
                break # 如果用户选择不继续，则退出循环
        elif choice == 'create_csv_header':
            create_csv_header() # 创建CSV文件头
            if not continue_prompt():
                break
        elif choice == 'exit':
            print("感谢使用BMR计算器，再见！") # 退出程序并输出感谢信息
            break

# 程序入口点，确保当脚本被直接运行时执行main函数
if __name__ == "__main__":
    main()